筆者終於用手機成功讀取 Aneng AN9002 藍牙數字萬用錶(Bluetooth Digital Multimeter / DMM)資料,並顯示讀取到 AN9002 的數據,初版程式是非常簡單,暫未能完備所有原廠的 APK 功能,但程式是可以升級,將來還可以加入不同的功能,而且還學習了不少新的知識,特別是 Samsung Galaxy M33 5G 手機,因為是 Android 12(Snow Cone / 2021)版本,很多新的功能和限制都要適應,也碰到很多挫折,最終都能夠解決,這就是最大的得著!
Aneng AN9002 藍牙低功耗(BLE)手機程式 APK |
- 操作系統:Windows 7 64-bit 版本
- 開發環境:Android Studio 4.0.1 版本
- 測試手機:Samsung Galaxy M33 5G
- 測試手機系統版本:Android 12(Snow Cone / 2021)
- 原程式:C:\Development\Development_Android\Android_Project\DIY-Android-121-17 BLEDMM bugworkshop AN9002 20230123
- 程式:C:\Development\Development_Android\Android_Project\DIY-Android-121-17 BLEDMM bugworkshop AN9002 20230123
藍牙低功耗(BLE)掃描編程步驟:
- 開啟藍牙啟用權,掃描藍牙設備,連接 Aneng AN9002 藍牙數字萬用錶 Device Address。
- 接收 Aneng AN9002 藍牙數字萬用錶傳送的 11字節(11Byte)資料。
- 解讀 11字節(11Byte)資料。
- 顯示解讀 Aneng AN9002 藍牙數字萬用錶的讀數。
DMMActivity.java - Decode Reading Data:
private static int[] hexInt = {0x41,0x21,0x73,0x55,0xA2,0xC1,0x32,0x71,0x66,0xAA,0x3B} ; private static int[] hexROR = {0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15} ; public static String Int2ArrayToDMM(byte[] byteArray) { s_MeterValue = ""; s_MeterRaw =""; int y0 = 0; int y1 = 0; int sData_MSB =0; int sData_LSB =0; int sData = 0; int[] segDigit = {0,0,0,0,0,0,0,0,0,0,0,0}; int[] funDigit = {0,0,0,0,0,0,0,0,0,0,0,0}; for (int x=0; x < byteArray.length; x++) { y0 = byteArray[x] & 0xFF ; y1 = hexInt[x] & 0xFF ; int aData = (y0 ^ y1) ; sData_MSB =(hexROR[aData & 0x0F]) <<4 ; if (x>3) { int segData_LSB = hexROR[aData & 0x0F]; int segData_MSB = sData_LSB << 4; sData = segData_MSB + segData_LSB; segDigit[x] = sData; if (x > 3 && x < 8) { if (x==4 && sData > 127) sData = sData & 0x7F; // The first Segment without . s_MeterValue = s_MeterValue + digitDMM(sData); } } sData_LSB =hexROR[(aData & 0xF0)>>4] ; sData = sData_MSB + sData_LSB; funDigit[x] = sData; s_MeterRaw = s_MeterRaw + (String.format("%02X", y0)) + " "; } functionDMM(segDigit); String gethex = hex5.toString(); return gethex; } |
DMMActivity.java - Decode Reading Data:
private static int[] hexInt = {0x41,0x21,0x73,0x55,0xA2,0xC1,0x32,0x71,0x66,0xAA,0x3B} ; private static int[] hexROR = {0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15} ; private static void functionDMM(int[] ai_DMM) { s_MeterOpt=""; s_MeterPre=""; s_MeterUnit=""; if((ai_DMM[8] & 0x80) > 0) { s_MeterOpt+="Hold "; } if((ai_DMM[8] & 0x08) > 0) { s_MeterOpt+="MAX "; } if((ai_DMM[8] & 0x04) > 0) { s_MeterOpt+="MIN "; } if((ai_DMM[10] & 0x08) > 0) { s_MeterOpt+="AUTO "; } if((ai_DMM[9] & 0x01) > 0) { s_MeterPre+="M"; } if((ai_DMM[9] & 0x02) > 0) { s_MeterPre+="k"; } if((ai_DMM[9] & 0x04) > 0) {s_MeterUnit+="Ω"; s_MeterType="Resistance"; return; } if((ai_DMM[8] & 0x40) > 0){s_MeterUnit+="Fahrenheit"; s_MeterPre+="°F";s_MeterType="Temperature"; return; } if((ai_DMM[8] & 0x20) > 0){s_MeterUnit+="Celsius"; s_MeterPre+="°C";s_MeterType="Temperature"; return; } if((ai_DMM[9] & 0x08) > 0){s_MeterUnit+="Hertz"; s_MeterPre+="Hz";s_MeterType="Frequency"; return; } if((ai_DMM[9] & 0x90) > 0){s_MeterUnit+="Faraday"; s_MeterPre+="nF"; s_MeterType="Capacitance"; return; } if((ai_DMM[8] & 0x02) > 0){s_MeterUnit+="%"; s_MeterPre+="%"; s_MeterType="Pencentage"; return; } if((ai_DMM[8] & 0x10) > 0){s_MeterUnit+="Diode"; s_MeterType="Diode"; return; } if(ai_DMM[8] == 0) { s_MeterUnit+="DC"; } if((ai_DMM[8] & 0x01) > 0){ s_MeterUnit="AC RMS"; } if((ai_DMM[10] & 0x02) > 0){ s_MeterPre += "μA"; return;} if((ai_DMM[10] & 0x01) > 0){ s_MeterPre += "mA"; return;} if((ai_DMM[10] & 0x10) > 0){ s_MeterPre += "A"; return;} int a = ai_DMM[10]>>1; if((ai_DMM[10] & 0x80) > 0) { if ((ai_DMM[10] & 0x40) > 0) { s_MeterPre = "mV"; return; } else if((ai_DMM[10] & 0x80) > 0) { s_MeterPre = "V";} } } private static String digitDMM(int dig) { String s_DMM =""; if(dig>127){s_DMM=".";} int d7 = dig & 0x7F; if(d7==0) { return s_DMM+"";} if(d7==0x7d){ return s_DMM+"0";} if(d7==0x05){ return s_DMM+"1";} if(d7==0x5b){ return s_DMM+"2";} if(d7==0x1f){ return s_DMM+"3";} if(d7==0x27){ return s_DMM+"4";} if(d7==0x3e){ return s_DMM+"5";} if(d7==0x7e){ return s_DMM+"6";} if(d7==0x15){ return s_DMM+"7";} if(d7==0x7f){ return s_DMM+"8";} if(d7==0x3f){ return s_DMM+"9";} if(d7==0x77){ return s_DMM+"A";} if(d7==0x4c){ return s_DMM+"u";} if(d7==0x6a){ return s_DMM+"t";} if(d7==0x4e){ return s_DMM+"o";} if(d7==0x68){ return s_DMM+"L";} return ""; } |