佰馬BMD100 5G/4G DTU是為無人值守場景設計的無線數(shù)傳終端,常用于工業(yè)物聯(lián)網(wǎng)、智慧水利、智慧環(huán)保等領域,實現(xiàn)數(shù)據(jù)無線傳輸。告警短信群發(fā),也是其中一項常用的功能,經(jīng)常被應用于遠程監(jiān)測告警信息發(fā)布、報警短信發(fā)送等,可以同時發(fā)送到20個手機,可以在后臺預設告警信息發(fā)布的內容、告警信息接收的手機號碼等。
案例:DTU短信群發(fā)在某空調生產(chǎn)公司的典型應用:
空調測試臺位自動化的項目,軟件由Labview編寫。 有一項功能為:當某傳感器值超過閾值后,要立即發(fā)送報警短信給每個測試員。即使測試員不在公司也要能即時收到此報警短信。 因此需要一臺可以通過上位機編程控制的DTU設備實現(xiàn)這個發(fā)送短信的功能,要求成本低,信號穩(wěn)定。
佰馬BMD100 5G/4G DTU實現(xiàn)短信群發(fā)的配置步驟:
1.使用佰馬配套的DTU管理軟件,直接出廠設置即可
比如要把 “設備使用異?!边@種告警短信發(fā)送給13912345678和18812345678,現(xiàn)在直接可以向串口發(fā)送: #13812345678,13912345678#設備使用異常#,接受號碼每隔5個一組,組與組之間要用英文分號隔開,一次最多4組。
2. DTU開啟短信備份功能
DTU里面配置好接收短信的號碼,最多20個,然后往串口發(fā)數(shù)據(jù),則DTU會把數(shù)據(jù)發(fā)給接收號碼
3. AT指令發(fā)送
DTU配置成modem模式
然后通過發(fā)AT指令發(fā)短信,具體實現(xiàn)過程如下:
用AT命令發(fā)送中文短信(PDU模式中英文混發(fā))
實例:
接收號碼:13812345678
內容:你好PDU模式
發(fā)送的AT指令
發(fā)送: AT+CMGF=0 (回車換行)
接收:OK
發(fā)送: AT+CSCS="UCS2" (回車換行)
接收:OK
發(fā)送:AT+CMGS=29 (回車換行)
接收:>
發(fā)送:
0011000D91683118325476F80008AA0e4f60597d0050004400556a215f0f(用ASCII類型發(fā)送)
發(fā)送:1A (Ctrl~z) (用16進制類型發(fā)送)
接收:+CMGS: 168(168:發(fā)送了多少條短信數(shù)量)
(不回車換行)
00 //為SCA預留
11 // FO 設置PDU 類型
00 // MR 發(fā)送參考號
0D //DA 目的號碼長度
91 //DA 目的號碼類型
68 //DA 中國的區(qū)號
3118325476F8 //接收號碼編碼 奇偶位互換,接收號碼為奇數(shù)個末尾用F補充
00 // PID 發(fā)送方式
08 //DCS 編碼模式
AA //VP 有效期
PDU 中用戶數(shù)據(jù)前的PDU 頭的長度是15 字節(jié)
0e //UDL 數(shù)據(jù)長度(16進制)
4f60597d0050004400556a215f0f //短信 數(shù)據(jù)內容Unicode 譯碼
發(fā)送拼接方式:
根據(jù)規(guī)律有些數(shù)據(jù)可以不變
0011000D9168+接收號碼編碼+0008AA+內容長度+數(shù)據(jù)內容Ucde 譯碼
接收號碼編碼:
列如:13812345678
1. 因為位數(shù)是奇數(shù)11位所以在末尾加F變?yōu)椋?3812345678F
2. 進行奇偶位置互換變?yōu)椋?118325476F8
以Java代碼為列下面是奇偶互換代碼
public static String Odevity(String string) {
String st ="";
if((string.length()&1) !=1) {
for (int i = 0; i < string.length(); i++) {
if((i&1) != 1){ //是偶數(shù)
st += string.charAt(i+1);
}
else {
st += string.charAt(i-1);
}
}
}
return st;
}
短信內容轉換成Unicode 譯碼
下面是任何內容轉換成Unicode 譯碼Java代碼
public static String GBK2Unicode(String gbString) {
char[] utfBytes = gbString.toCharArray(); //utfBytes = [測, 試]
String unicodeBytes = "";
for (int byteIndex = 0; byteIndex < utfBytes.length; byteIndex++) {
String hexB = Integer.toHexString(utfBytes[byteIndex]); //轉換為16進制整型字符串
if (hexB.length() <= 2) {
hexB = "00" + hexB;
}
unicodeBytes = unicodeBytes + hexB;
}
return unicodeBytes;
}
發(fā)送內容長度計算
如:真實內容長度/2=發(fā)送內容長度(要轉換成16進制)
如果轉換成16進制長度少于2位在前面加個0
列:28/2 = 14 轉換成16進制得到“e” 少于兩位要在前面+0 得到“0e”。
佰馬Baimatech,集M2M產(chǎn)品研發(fā)、IoT平臺服務、國際化運營于一體,讓我們聯(lián)接,共創(chuàng)未來