碼迷,mamicode.com
首頁 > 微信 > 詳細

記錄使用微信小程序的NFC和藍牙功能讀取15693芯片的開發歷程

時間:2018-03-18 21:43:00      閱讀:5528      評論:0      收藏:0      [點我收藏+]

標簽:分享   框架   自動   api   影響   包括   back   輸入關鍵字   data极速时时彩走势图   

開發目標:

极速时时彩走势图(1) 對于Android手機,直接通過微信小程序調用手機的NFC功能,對15693協議的芯片進行讀寫操作;

(2)對于蘋果手機(及沒有NFC模塊的手機),通過微信小程序的藍牙功能連接到藍牙/NFC讀寫器,然后通過藍牙發送指令操作讀寫器對15693協議的芯片進行讀寫操作。

 

DAY #1

极速时时彩走势图上午開了半天會,下午開始開發。

 

先開發簡單的:直接通過Android手機的NFC模塊讀寫芯片。開發思路如下:

1. 首先調用 wx.getHCEState(OBJECT), 判斷設備是否支持NFC,如果不支持就走藍牙通道;

2. 調用 wx.startHCE(OBJECT) 初始化手機的NFC模塊;

3. 初始化完成后,調用  wx.onHCEMessage(CALLBACK) 監聽芯片響應的消息;

4. 點擊頁面上的“詢卡”按鈕,調用 wx.sendHCEMessage(OBJECT)發送詢卡指令;

极速时时彩走势图5. 這時 wx.onHCEMessage(CALLBACK) 應該可以收到帶有uid信息的芯片響應數據;

6. 根據uid發送select指令,以及后續多個指令;

极速时时彩走势图7. 全部操作完成后之后,調用 wx.stopHCE(OBJECT) 停止手機的NFC模塊;

8. 完成。

 

极速时时彩走势图思路很清晰,并且開發思路中需要用到的每一個NFC的接口都有對應文檔,應該是沒有什么問題了,接著就開始開發NFC模塊了。

 

第一步、微信小程序基本框架搭建,非常順利的完成界面,調試模式等。

然后開始寫nfc模塊,首先是 wx.getHCEState(OBJECT),比較順利,同時測試了一下沒有NFC模塊的手機/NFC為開啟等多種情況的返回值(因為小程序開發文檔沒有寫啊)。

 

然后是初始化NFC模塊,也比較順利。

 

然后完成wx.onHCEMessage(CALLBACK)消息監聽,然后就是點擊按鈕發送消息  wx.sendHCEMessage(OBJECT),從這時開始就開始進入無助的狀態。

 

嘗試了多組數據進行發送,始終不能觸發 wx.onHCEMessage, 折騰了半個小時,未果,等第二天解決吧。

 

DAY #2

 

首先仍然懷疑是數據格式不對,因為第一次開發跟芯片相關的程序,并且也是第一次接觸15693協議,所以一開始非常堅定的相信是自己組裝的發送數據不對,然后就去請教了芯片開發大牛,以及把15693協議的相關部分讀了大約10遍,在網上找15693協議相關資料,百度微信小程序NFC開發資料。

 

极速时时彩走势图還是不能觸發 wx.onHCEMessage。

 

极速时时彩走势图直到在微信小程序開發社區,輸入關鍵字“wx.onHCEMessage”,然后從寥寥的幾篇post中,終于明白:TMD微信小程序的NFC功能僅僅是把手機模擬成一張芯片卡,而不是把手機當做芯片讀寫器!! 

 

這時已經下午3點。

 

因為我一開始跟公司領導說的是微信小程序可以直接調NFC讀取芯片,這下就尷尬了,對項目的規劃影響巨大。然后,抱著一絲恐懼,也抱著一絲希望,多方搜索,多方確認,TMD微信小程序目前確實只能把手機模擬成一張芯片卡。

 

极速时时彩走势图然后跟公司領導電話里簡單匯報了一下,領導說第二天開會討論。

 

然后開始寫藍牙通道的解決方案。

 

微信小程序開放的藍牙接口如下:

技術分享圖片

 

极速时时彩走势图共18個接口,實在是太多了。這里不得不吐槽一下微信小程序的架構師們,你們設計的開發文檔太粗糙了,需要開發人員寫大量的代碼才能完成一些基本功能,比如我自己想要完成的一些功能:

极速时时彩走势图1. 初始化藍牙模塊;

2. 打開/關閉藍牙發現;

极速时时彩走势图3. 隨時只允許單一設備連接,不允許多設備連接;

极速时时彩走势图4. 已連接上的藍牙斷開后自動重連,自動重連失敗后提示并繼續自動重連;

5. 每次連上藍牙設備后自動記住藍牙設備ID,并寫入一個長度為5的數組,并寫到storage里面,這樣下次進入小程序后就可以自動連接曾經連過的藍牙設備。

 

极速时时彩走势图下面是我希望自己的程序可以這樣調用藍牙模塊的偽代碼:

 1 Page({
 2     onLoad: function(){
 3         ble.onMessageReceived = function(res){
 4             
 5         };
 6         ble.onDeviceFound = function(device){
 7             //參數是device 而不要 devices
 8         };
 9         ble.autoReconnect = true;
10         ble.maxConnections = 1;
11         ble.maxRememberedConnections = 5;
12         ble.init(function(){ //init 方法里面初始化藍牙模塊
13             ble.autoConnectToRememberedDevice(function(res){
14                 if(ble.connectedDevices.length == 0){
15                     //連接記住的設備失敗,跳轉到藍牙發現頁面
16                 }
17             });
18         });
19     },
20     connectToNewDevice: function(newDeviceId){
21         //由于設置了最大連接數為1,這時調這個方法就會主動斷掉之前的連接
22         //這樣就不需要先調 disconnect了, 也不需要檢查設備ID/狀態是否不一致
23         ble.connectToDevice(newDeviceId, function(){
24             
25         });
26     }
27 });

 

既然微信沒有實現這個簡便的ble,就只有我自己來實現了。

 

极速时时彩走势图當天下午剩下的一兩個小時,已經將這個ble寫的差不多了,等到第二天來調試。

 

DAY #3

早上一來跟領導開會,確認對于Android手機必須開發APP以避免使用藍牙讀寫器,小程序仍然要開發,因為iOS系統始終需要讀寫器才能對芯片進行操作。

 

极速时时彩走势图開完會就開始進入藍牙模塊的調試。

 

首先遇到的問題就是獲取不到藍牙設備的名稱,嘗試從advertiseData解析,嘗試在網上找了很多資料,未果。看了論壇的很多帖子,應該是小程序API還不能很好的兼容其他設備的,也就是說對于這塊功能還很不成熟。

 

于是就只有暫時放棄解決藍牙設備名稱的問題。

 

极速时时彩走势图繼續完善ble模塊,到下午下班的時候藍牙連接模塊已經比較成熟了,上文提到的那些功能全部都已實現,并且封裝之后的BluetoothManager非常好用,表現也很穩定,體驗很流暢,跟iOS系統的wifi連接模塊的體驗差不多。

 

DAY #4

早上一來就開始繼續寫藍牙的讀寫功能。這里不得不吐槽一下微信小程序的架構師們,開發人員使用你們設計的接口,就完成一個讀寫功能需要調好幾個接口,太復雜了。下方是我寫的ble開放的幾個接口,真希望微信小程序的架構師們也能開發一些這樣的快捷接口:

 1 Page({
 2     onLoad: function(){
 3         ble.onMessageReceived = function(res){
 4             if(詢卡指令返回){
 5                 ble.sendMessage("發送select指令");
 6             }
 7         };
 8         ble.init(......);
 9     },
10     doInventory: function(){
11         ble.sendMessage("發送詢卡指令")
12     }
13 });

 

等到把這部分代碼寫完,正好公司購買的藍牙讀寫器到貨,馬上拆開進行測試。

 

极速时时彩走势图首先是啟動微信小程序,自動進入發現頁面,很快找到了新的藍牙設備,值得慶幸的是竟然讀到了新設備的名稱(而不是像其他藍牙設備一樣返回空)。選擇該設備進行連接,非常順利,然后繼續測試了一下斷開自動重連,更換設備(保持單一連接),記住連接過的藍牙設備,中途修復了兩三個小bug,又改進了一下體驗,應該說連接部分比較完美了。

 

然后就是要測試第一個指令:詢卡。

 

由于讀寫器自帶一個詢卡按鈕,通過按一下按鈕就發送詢卡指令的方式,所以詢卡變得很簡單。于是對于代碼而言,按了詢卡按鈕之后應該直接進入wx.notifyBLECharacteristicValueChange(OBJECT)。寫好相應初始化以及消息監聽代碼之后,就等著按一下詢卡按鈕了。

 

一按,果然收到消息回調了!調試了這么多天,終于可以觸發NFC消息通知了!雖然很簡單,但是確實是很激動。

 

极速时时彩走势图消息回調雖然收到了,但是不知道響應消息的格式,也就無法解析,不曉得芯片是不是正確響應了。問了芯片廠家,又問了讀寫器生產廠家,終于問到了詢卡指令的響應格式,按照格式解析出來了UID,這么多天終于讀到了UID!再對比芯片廠家提供的demo app以及讀寫器廠家提提供的桌面程序,確認讀到的UID是正確的。

 

接下來便是發送select指令。下圖為15693 select指令格式:

技術分享圖片

首先第一個字節flags就不知道怎么拼,select字節傳0x25,UID已得到,CRC不知道怎么計算。

 

在網上看了很多資料,包括芯片廠家也說CRC一般是不需要傳值的,因為大多數讀寫器都會在內部進行CRC的計算。好吧,我暫且相信,那么就只剩下一個參數了,那就是flags參數。按照15693協議規定,試了多種組合,嘗試發送select指令(在第一個詢卡成功的消息回調中發送),然而收不到任何響應消息。

 

极速时时彩走势图下班后折騰了一個多小時,做了各種數據格式的嘗試,翻閱了多個資料,將手里的15693協議的相關部分閱讀了多次,還是收不到任何響應消息。無賴,不得不下班了。等第二天再來研究吧。

 

DAY #5

繼續研究select指令。在跟讀寫器廠家交流的過程中得知,CRC是必須自己計算的,不能不傳,然后就從讀寫器廠家提供的DEMO代碼中找到了CRC的算法,然后用JS實現了一遍,然后好不容易在讀寫器廠家的技術文檔中看到一個CRC計算示例,根據示例的傳入參數和計算結果再次確認了自己的JS算法是正確的。

 

然后,不管怎么傳參數格式,select指令發送成功后收不到任何消息。

 

极速时时彩走势图在絕望之時,干脆不用讀寫器自帶的詢卡按鈕,自己按照15693協議發送詢卡指令。到這時,在跟讀寫器廠家溝通的過程中得知,他們生產的藍牙NFC讀寫器都有自己的數據傳輸格式,不能完全按照ISO15693協議來寫,得按照他們提供的文檔來寫,當然,到這時候讀寫器廠家提供的文檔也讀過將近十遍了,請求格式響應格式已比較熟悉。所以幾分鐘就完成了詢卡代碼。

 

寫完代碼之后進入調試,直接就收到了詢卡之后的響應,然而在接下來的發送select指令后還是沒有收到任何響應。當然,這也本在預料之中。這個時候對讀寫器廠家的懷疑不斷加深,越來越覺得他們賣的讀寫器無法讀到我們的芯片,想要退貨。

 

极速时时彩走势图但我還是沒有死心,嘗試按照讀寫器廠家提供的文檔,一步一步組裝數據。在之后的大概第3次嘗試中,竟然收到了select指令的響應!并且按照響應格式解析數據表明芯片響應成功!

 

极速时时彩走势图太激動了!!!

 

后來才明白,為什么按讀寫器自帶的詢卡按鈕之后發送的select指令收不到響應,而自己通過藍牙發送的詢卡指令就收到了響應,我猜測是因為按鈕發起的通訊會話跟藍牙發起的會話完全就是不同的會話導致的,所以點擊讀寫器自帶的詢卡按鈕之后再通過藍牙發送select指令,應該就相當于直接對著一張芯片發送select指令,當然不會收到任何響應了。

 

這時,調通了第一個指令,想當然的我覺得后面的指令肯定不是問題了,肯定就會變得非常簡單。

 

然而,更讓人絕望的事情發生了。

 

要說select指令的困惑,差不多花了我4個小時,并且一開始還是非常相信讀寫器可以通過藍牙完成select指令的,一直到最后才有點懷疑讀寫器的問題。

 

接下來的這個指令是芯片廠家的一個定制指令,不屬于ISO15693協議規定的范圍之內,讀寫器廠家提供的文檔中自然不會包含整個定制指令。所以只能按照芯片廠家給的文檔來發送指令。

 

极速时时彩走势图很顯然,這肯定是行不通的。讀寫器肯定只能認識讀寫器廠家給的文檔中定義的指令格式,然而這個淺顯的道理我大概花了1個小時才明白,在嘗試了多種嘗試之后冷靜下來一思考就明白了。

 

极速时时彩走势图然后就是找讀寫器廠家溝通。這個過程也是非常絕望的,因為在跟芯片廠家溝通的過程中得知,必須要讀寫器支持15693透傳協議才可能發送定制指令。然而問了讀寫器廠商,他們自己也不確認 這款產品的藍牙通道是否支持透傳,他們有另一款產品支持透傳,但是不支持藍牙,這讓我一度覺得肯定要把讀寫器退貨了,然后再重新買一個支持15693協議并支持藍牙透傳的讀寫器。

 

然后抱著一絲絲希望,跟讀寫器廠家咨詢了很久,他們建議我按照他們另一款支持透傳協議的讀寫器的文檔來開發。

 

极速时时彩走势图真的自己都不抱什么希望了,只是再寫幾行代碼總比立即去買一個新的讀寫器來的更簡單一些,于是又做了一次嘗試。

 

這次按照另一款讀寫器的透傳協議,更改了定制指令的格式。

 

竟然!竟然直接就收到了芯片響應!

 

太激動了!

 

极速时时彩走势图激動了3分鐘之后,靜下來一看,響應的數據太短,肯定不是正確的數據,然后比對文檔中的響應格式,確認芯片沒有能夠正確響應。

 

极速时时彩走势图這時還是繼續懷疑讀寫器不支持透傳指令,于是再跟讀寫器廠家溝通,把響應數據發給了他們看,他們確定芯片是收到了指令了,只是指令格式不對,芯片沒有回發正確的數據。

 

這時已經下班十幾分鐘了,感覺就還剩這一個問題了,如果不能確定該讀寫器是否支持透傳,那接下來的周末肯定是無法好好休息的。

 

但這時已經對讀寫器很有信心了,比較堅定的認為是定制指令格式不對。然后又找芯片廠家要了他們以前發送的demo代碼,指令的示例,然后又把芯片廠家的對應文檔閱讀了幾遍,幾乎一個字一個字去理解協議中的每一個字。

 

終于,終于發現指令中的某個代表響應數據長度的字節計算錯誤,當把這個錯誤數據修復之后就立即收到了正確的響應了。

 

极速时时彩走势图太不容易了!

 

技術分享圖片

 

終于可以安心的下班了!

 

后記

之后的開發都比較順利了,因為要么就是給讀寫器發送讀寫器自定義的指令,要么就是用透傳功能發送芯片自定義的指令,可以說是所有指令都可以發送了。

 

這次芯片項目開發收貨到最有價值的經驗就是,一般讀寫器廠家都會有自己定義的一套指令格式,或者SDK,當通過讀寫器操作芯片的時候,必須要首先按照讀寫器的API文檔來寫,否則芯片不可能有響應的。

 

 

 

 

 

 

 

 

信息

 

記錄使用微信小程序的NFC和藍牙功能讀取15693芯片的開發歷程

標簽:分享   框架   自動   api   影響   包括   back   輸入關鍵字   data极速时时彩走势图   

原文地址:https://www.cnblogs.com/leotsai/p/weixin-applet-nfc-bluetooth-dev-experience.html

(0)
(3)
   
舉報
評論 一句話評論(0
0條  
登錄后才能評論!
           
? 2014 mamicode.com 版權所有 京ICP備13008772號-2
迷上了代碼!