Today I received my NB-IoT Arduino Shield for AIS (Thailand). Here is a "pinout" photo of the shield.
My shield looks just like the one above, for the most part. I'll post another photo of the actual device later.
When I received the shield in the mail, I went immediately to a local AIS office in the mall to have it activated.
Of course, none of the regular service people at the counter knew anything about registering this device with AIS; and at first they told me I could not register it because I had to also have an AIS SIM card and mobile number. Naturally, I told them (very strongly) that was absolutely not the case and the "SIM" was in the board which you could clearly see in the form of an "IEMI" and serial number on the bottom of the device. The counter people were nice, despite some older, foreign guy insisting, in their language (spoken as a non-native speaker), that I did not need an AIS SIM card and that they could register this device without one.
Patiently, and after about 30 minutes of "not much real progress" at the counter, the counter staff disappeared to the back room (to escape my lecturing them that I did not need a mobile SIM card); and after about 10 minutes had passed, the service counter team returned with a "manager", who knew exactly how to register it and explained to the counter team, in a mentoring way, step-by-step, how to register and activate my NB-IoT device.
During that time, the manager (who was a great guy and very helpful) told me, in reply to me asking a number of questions, that only around one person a month registers a device like this, on average, and they are mostly students. So, I thought then, it surely looked funny to them to see a retired techie like me registering this device.
After running some errands on my motorcycle, I got home and immediately inserted the shield into my Arduino; checked that I had installed the AIS libraries (earlier I did the prep work); started my very simple UDP server I wrote in Python for testing purposes on a server in the USA.
Here is a link to the AIS_NB_BC95 libs on GitHub, with the example sketch:
https://github.com/AIS-DeviceInnovation/AIS_NB_BC95
Note: I think it is very cool that the Thais are using GITHub to manage all these libs and test code.
Here was the sketch for the Arduino:
#include "AIS_NB_BC95.h"
String apnName = "devkit.nb";
String serverIP = "udp_server_ip_here"; // My Server IP back in the USA
String serverPort = "upd_port_number_here"; // My Server Port back in the USA
String udpData = "HelloWorld";
AIS_NB_BC95 AISnb;
const long interval = 5000; //milliseconds
unsigned long previousMillis = 0;
long cnt = 0;
void setup()
{
AISnb.debug = true;
Serial.begin(9600);
AISnb.setupDevice(serverPort);
String ip1 = AISnb.getDeviceIP();
delay(1000);
pingRESP pingR = AISnb.pingIP(serverIP);
previousMillis = millis();
}
void loop()
{
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval)
{
cnt++;
// Send data in String
UDPSend udp = AISnb.sendUDPmsgStr(serverIP, serverPort, udpData+" "+String(cnt));
//Send data in HexString
//udpDataHEX = AISnb.str2HexStr(udpData);
//UDPSend udp = AISnb.sendUDPmsg(serverIP, serverPort, udpDataHEX);
previousMillis = currentMillis;
}
UDPReceive resp = AISnb.waitResponse();
}
Here was my "test setup" Python code:
"""
NB-IoT First Test Code, Simple Authentication Override, version 0.2
Listens on a port for UDP, simple authentication, echo back with unix time
Neo www.unix.com
Jan 2020
"""
import socket
import sys
import time
# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
port = 13131
# Bind the socket to the port
server_address = ('www.mytestserver.com', port)
print >>sys.stderr, 'starting up on %s port %s' % server_address
sock.bind(server_address)
password = "blah_blah_blah\n"
authenticated = True // override simple authentication for testing
receivepw = True // override simple authentication for testing
lastsent = 0
while True:
print >>sys.stderr, '\nwaiting to receive message'
now = time.time()
data, address = sock.recvfrom(4096)
site = address
if data:
lastsent = time.time()
if authenticated == False and receivepw == False:
sent = sock.sendto("Password: ", address)
receivepw = True
elif receivepw == True and authenticated == False:
if data == password:
sent = sock.sendto("Authenticated\n", address)
authenticated = True
else:
sent = sock.sendto("Password:\n", address)
print >>sys.stderr, 'a: sent %s bytes back to %s' % (sent, address)
elif authenticated == True:
received = "You sent: " + data
sent = sock.sendto(received, address)
data = time.time()
data = "Unix Time: " + str(data)+"\n"
sent = sock.sendto(data, address)
print >>sys.stderr, 'b: sent %s bytes back to %s' % (sent, address)
else:
sent = sock.sendto("Error\n", address)
print >>sys.stderr, 'c: sent %s bytes back to %s' % (sent, address)
Well, it would not connect.... many tries... no connection to the AIS network.....
The Arduino serial monitor showed it kept getting stuck on this line in the AIS lib code (debug message):
19:03:18.470 -> # Connecting NB-IoT Network..................................................
I posted a question on the AIS NB-IoT group on FB and went to the local fish market; and got some replies but nothing really technical, just a confirmation that another person had the same results. Well, "misery loves company", as they say.
Then, eating some local fish at my desk, I decided to connect the device to my laptop and go outside to the "city side" balcony in my condo.
No luck.
I put the test setup on my desk, and continued eating, then noticed on my UDP server log output, that it had connected and pinged a few times and stopped. Yea!
Next, now feeling like I was getting somewhere, I took my setup out to the ocean facing balcony, and ... yea! it connected.
So, I immediately realized it was a signal quality and location issue; and so I walked around the building, in the parking garage, running the test ping program from AIS.
In the next post, I'll post some of the output from the Arduino serial monitor, for completeness.
The Bottom Line / Initial Impressions:
- This NB-IoT device has low signal quality from high floors in my building (over 20 floors high).
- This NB-IoT device has low signal signal quality from underground parking (one level underground) in my building, except near the entrance ramps in my area.
- This NB-IoT device has low signal quality between the buildings and there were a number of "dead areas" where the signal was lost and not recovered.
- This NB-IoT device works OK at the ground level of the building (for the most part) and at ground level in most open areas.
- This NB-IoT device would disconnect from the network when in a dead area and it mostly required a device restart to reconnect. Note: This issue could be mitigated by adding a few lines of code in the sketch to attempt to reconnect to the network after some timeout, or based on reading the signal strength on the device.
Next Steps:
- Read the AIS Library for this device and see if I can get the signal strength from the device and use the signal strength in the code for connection management and status messages. If so, this is good. If not, request this modification from AIS tech support, or search the network and see if can get it for the NB-IoT chipset on the device.
Will post some survey "ping" samples from the device to my test server after I transfer the data from my laptop to my desktop.
In a nutshell, this NB-IoT reminded me of the "good ole' days" when mobile phone quality was quite poor (in the early days of mobile phones, because they become commonplace) and connections to the network were unreliable. I would not use this, in its current form, for any mission critical application, because it is not (yet)reliable and the signal quality is low / weak in my areas-of-interest (AOI). I guess I could get an SMC power pre-amplifier in the frequency range or a higher gain antenna and see if that helps