经过加里罗伯茨|更新日期:12/09/2015

您曾经想要的能力,以控制您的数据记录器乌鸦蜂窝调制解调器?如果能够获得关于您的移动调制解调器及其数据网络的健康状况的数据,会很好吗?也许你想重置你的乌鸦猫。如果我告诉您,使用CRBasic编程语言可以很容易地完成所有这些工作呢?在这篇文章中,我将与您分享我尝试这种方法的经验,并向您展示如何做到这一点。
在为客户做一些研究时,我在Raven XT手册中发现了一些有趣的信息。该手册指出,Raven调制解调器可以通过TCP/IP协议的终端程序使用AT命令驱动。这些AT命令是一组指令,用于控制、拨号和配置调制解调器。
为你推荐:中列出的AT命令来自Sierra Wireless的“支持AT命令参考”文件.有关AT命令及其设置的更新列表,请查看Sierra Wireless为您的调制解调器提供的web管理界面。 |
基于此信息,我决定在Loggernet的设备配置实用程序(DevConfig)中使用这些命令来检查当前调制解调器设置,更改设置,并指示调制解调器进行各种活动。
以下是我也想尝试的步骤:


通过以下步骤,我知道我可以从我的调制解调器中获得有价值的,实时信息。如果它用手使用终端程序执行它,肯定是一个Crbasic数据记录器可以获得相同的数据,以及为我的数据存储数据以供以后使用和分析,右图?
为了让我的CRBasic数据记录器像我的终端程序一样使用TCP/IP与Raven调制解调器“交谈”,我需要将调制解调器和数据记录器配置为点到点协议(PPP)。要做到这一点,请遵循Raven调制解调器手册中的说明。您可以在附录中找到配置PPP调制解调器的说明。
我开始像往常一样编写我的CRBasic程序。我使用了CRBasic Editor生成的基本模板,并添加了一组用于存储调制解调器信息(包括RSSI)的变量。
笔记:您正在使用的调制解调器可能有更多或不同的变量可以查询,但下面的列表显示了我想要跟踪的变量。
“公共变量用于存储信息我们收到从乌鸦现代公共current_day_usage只要单位current_day_usage = kB公共current_month_usage长单位current_month_usage = kB公共current_week_usage长单位current_week_usage = kB公共network_operator字符串公共network_service_type字符串network_state作为字符串* 50公共previous_day_usage只要单位previous_day_usage = kB公共previous_month_usage长单位previous_month_usage = kB公共previous_week_usage长单位previous_week_usage = kB公共raven_date_time作为字符串公共raven_device_port只要公共raven_domain公共raven_esn字符串的字符串公共raven_ip_address字符串模糊dns_ip_address作为字符串公共raven_phone_number字符串公共raven_mac_address作为字符串公共raven_modem_name字符串公共raven_serial_port_configuration作为字符串公共raven_serial_port_mode字符串公共raven_voltage单位raven_voltage =公共rssi伏
在从调制解调器返回数据之后,需要对其进行解析。要保存解析所需的信息,您需要创建一些临时字符串变量和一个TCP/IP套接字。我是这样做的:
Public socket(2) As Long Public units_on_usage_data As String '变量,用于解析Raven调制解调器返回的字符串。Const CRLF = CHR(13) & CHR(10) Dim returned d_value As String * 70 'Temp String,用来保存调制解调器Dim string_location返回的值
在对我的程序进行一次缓慢的序列扫描时,我在Raven调制解调器上打开了一个TCP/IP套接字,端口为2332。你可以使用TCPOPEN()CRBASIC中的指令连接到您的Raven Modem内部(其防火墙后面)默认TCP / IP地址为192.168.13.31。这会创建一个Comport参数,您可以在程序中稍后使用,而不是指定通信端口。
提示:使用TCPOPEN()以缓慢顺序执行的指令,以防出现故障和连接失败。这样,你的其他关键测量就不会被耽误了。
socket(1) = TCPOpen("192.168.13.31", 2332,100)
当我知道我有一个良好的套接字连接(即,套接字报告的值大于100)后,我尝试登录到调制解调器的终端。你可以使用serialout()使用刚刚创建的TCP / IP套接字作为COPPORT参数的指令。
如果(套接字(1)> 0)然后序列号(套接字(1),“”,“密码”,1,2)“在发送密码之前等待密码提示。
数据记录器在移动到下一个指令(或其超时)之前等待“密码”单词。
SerialOut(套接字(1),“12345”&CRLF,“OK”,1,200)'发送密码并等待OK继续前进。
在数据记录器成功地“看到”单词“Password”之后,它将发送密码“12345”,后跟一个回车和换行符(相当于单击进入按键盘上的按钮)。然后,数据记录器等待“OK”,然后再移动到下一个CRBasic指令。
你可以使用serialflush()说明清除数据记录器的串行缓冲区。(我这样做是为了我知道我正在使用一个干净的缓冲区,清除可能会弄乱我运行的Clbasic代码的惊喜。)数据记录器然后发送“at * netrssi?”AT命令对调制解调器(后跟回车返回和行馈送) - 在使用DevConfig中使用终端程序时,就像使用。
SerialFlush(插座(1))序列号(插座(1),* netrssi?“&CRLF,CRLF,200)”信号强度(RSSI)查询。
然后,数据记录器将通过调制解调器查看返回它的字符串,搜索第一次回车返回和行馈送。在数据记录器具有返回“返回_Value”的回车返回和行馈送的位置之后,它使用此位置复制回车前的所有内容以及向“rssi”变量的行送到“rssi”变量,这也是一个字符串。
SerialIn(returned d_value, socket(1), 100,0,1000) string_location = InStr(1, returned d_value, CRLF, 2) rssi = Mid(returned d_value, 1, string_location - 1)
您的数据记录器现在拥有Raven调制解调器的当前RSSI值,可以存储该信息、操作它、将其发送给您,等等。从你的调制解调器获取信息很容易,不是吗?
当您完成获得所需的数据时,可以使用TCPClose ()指令,让您的数据记录器关闭您的Raven调制解调器的IP插座。
TCPClose(套接字(1))
既然您使用数据记录器将数据从调制解调器获取数据,您可以了解如何操作和控制调制解调器。在下面的代码示例中,您可以看到如何在一小时顶部重置或重新启动调制解调器。然后数据记录器通过与我们刚刚经历的示例中所做的相同的登录过程进行。当它成功登录时,它将AT命令“atz”发送给调制解调器。
If(IfTime(0,1, hr)) Then socket(2) = TCPOpen("192.168.13.31", 2332,100) SerialOut(socket(2), "", "Password", 1,200)'在发送密码前,请等待“密码”提示。SerialOut(socket(2), "12345" & CRLF, "OK", 1200)’发送密码,然后等待确认。If(socket(2) > 0) Then SerialFlush(socket) SerialOut(socket, "ATZ" & CRLF, CRLF, 1, 200) If(socket(2) > 0) Then SerialFlush(socket)'Reset/reboot the raven modem EndIf If(TCPClose(socket(2)) = 2) Then socket(2) = -1 EndIf .
提示:在您的程序中,重新启动是一个很好的命令,因为有时modem与蜂窝网络的连接会失效。重新启动将刷新所有内容并使其再次工作。
有关此程序的完整示例,其中包括从Raven调制解调器获取其他数据项,下载Raven-Status。dld文件.
我希望你发现这些信息很有用。如果您有任何疑问,澄清或增强功能,请在下面发布。
评论
卢卡斯z。|05/30/2018 01:07 PM
你好,我意识到这篇文章现在是几年前的,但我想使用类似的代码通过数据记录器上的RS-232端口(串行)与较新的RV50模型通信,而不是IP连接。我想编码这个信息,每天从记录器传输和复位调制解调器。你能提供一些关于配置SerialOpen和延迟时间的指导吗?我使用的代码目前似乎不能工作。谢谢你的帮助!
请登录或注册置评。