Skip to content

Instantly share code, notes, and snippets.

@adrianlzt
Last active November 5, 2021 19:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save adrianlzt/766991a06adf9cb7c1119724dd710f34 to your computer and use it in GitHub Desktop.
Save adrianlzt/766991a06adf9cb7c1119724dd710f34 to your computer and use it in GitHub Desktop.
Simulator for waveshare gsm hat. Tested against the Civlo85/gsmHat lib. Not complete
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
pyserial = "*"
requests = "*"
[dev-packages]
bpython = "*"
[requires]
python_version = "3.9"
{
"_meta": {
"hash": {
"sha256": "2ddca85becbd84fb4967c945fb6e710b41ae4c73251addaceaf2cd4d3e226caf"
},
"pipfile-spec": 6,
"requires": {
"python_version": "3.9"
},
"sources": [
{
"name": "pypi",
"url": "https://pypi.org/simple",
"verify_ssl": true
}
]
},
"default": {
"certifi": {
"hashes": [
"sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872",
"sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"
],
"version": "==2021.10.8"
},
"charset-normalizer": {
"hashes": [
"sha256:e019de665e2bcf9c2b64e2e5aa025fa991da8720daa3c1138cadd2fd1856aed0",
"sha256:f7af805c321bfa1ce6714c51f254e0d5bb5e5834039bc17db7ebe3a4cec9492b"
],
"markers": "python_version >= '3'",
"version": "==2.0.7"
},
"idna": {
"hashes": [
"sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff",
"sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"
],
"markers": "python_version >= '3'",
"version": "==3.3"
},
"pyserial": {
"hashes": [
"sha256:3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb",
"sha256:c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0"
],
"index": "pypi",
"version": "==3.5"
},
"requests": {
"hashes": [
"sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24",
"sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"
],
"index": "pypi",
"version": "==2.26.0"
},
"urllib3": {
"hashes": [
"sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece",
"sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'",
"version": "==1.26.7"
}
},
"develop": {
"blessings": {
"hashes": [
"sha256:98e5854d805f50a5b58ac2333411b0482516a8210f23f43308baeb58d77c157d",
"sha256:b1fdd7e7a675295630f9ae71527a8ebc10bfefa236b3d6aa4932ee4462c17ba3",
"sha256:caad5211e7ba5afe04367cdd4cfc68fa886e2e08f6f35e76b7387d2109ccea6e"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
"version": "==1.7"
},
"bpython": {
"hashes": [
"sha256:64a2032052c629f0fc2d215cdcf3cbdc005d9001a4e8c11b2126e80899be77fb",
"sha256:88aa9b89974f6a7726499a2608fa7ded216d84c69e78114ab2ef996a45709487"
],
"index": "pypi",
"version": "==0.21"
},
"certifi": {
"hashes": [
"sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872",
"sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"
],
"version": "==2021.10.8"
},
"charset-normalizer": {
"hashes": [
"sha256:e019de665e2bcf9c2b64e2e5aa025fa991da8720daa3c1138cadd2fd1856aed0",
"sha256:f7af805c321bfa1ce6714c51f254e0d5bb5e5834039bc17db7ebe3a4cec9492b"
],
"markers": "python_version >= '3'",
"version": "==2.0.7"
},
"curtsies": {
"hashes": [
"sha256:11efbb153d9cb22223dd9a44041ea0c313b8411e246e7f684aa843f6aa9c1600"
],
"markers": "python_version >= '3.6'",
"version": "==0.3.10"
},
"cwcwidth": {
"hashes": [
"sha256:106efcbe26c495720cdfd4694e4c191ce1a3c1268b2d90356c875fd109d78a46",
"sha256:1dc35642fd1a26ce63236c18d7d4a32909be2b1e99b272be95859872f97d1d28",
"sha256:21701b63cc4e287a197e65c033583bbea674ec7176f983c5fff77fa82118d440",
"sha256:23fa1021135b8b99e9d4478097ce42aaa17d957c037d5a76e990de20262d76d4",
"sha256:268775831c952d45cf8165bc9168585868e933a87b72f6f1bd35230ad5206f1f",
"sha256:2c840e7d85f6de45c45986b416d79312c91882e1121b78d4c347e49c4238c09d",
"sha256:3fe12ba738548ff5ad3081621d22b7bff97fa78258c44a6586e97ec4f1430739",
"sha256:4a25161e4302413b8b4c3379b29c1adcbe04c05380a6dfc8e4eb0e3938e4b3f9",
"sha256:4c3ab17f0ee34d71b7de12d543eb40f1a6aae9339c9221b96b06970e6299bd10",
"sha256:66addcb77a16d3e1ab817bea337ffb2509c57af6d91f5515c37811b081e7a448",
"sha256:672b0d4b9d39642c023a80daf4a8623b3aa63a31275c20f705569e3b50021b06",
"sha256:6fbbdbc742d78d732f0cfd3f69672f3805ec6c766f14460f8c392f624ea7af09",
"sha256:77c0492c65555dfd022635ffc83365bbf2b15e95fde030b95ee9b2409ce98909",
"sha256:9321274eca7fd4323a3f0eb472d08a08dfa7e2e0d797b713167d5106e41c92ad",
"sha256:a6385cfdb3f0cfd4f42ab73d2c965e8f133f4f78ad56a7495f6e5924165a6c73",
"sha256:a6a1b285655c7c86ceebe241f722fe19ccdef4891f7dced8cd818c966b6bb9d9",
"sha256:ae134791ea6024bc0397f6b6a15d398f31167ad4b71190278e9c02178dad6948",
"sha256:b05739a439f815c85b47abfb3fea301354762950142539d13263a353f21a90f6",
"sha256:d3dc22afbaeba3b3a168e6a15e194d55fb63f01720feee53051b62f0f1c6165f",
"sha256:f1777c325f7153b4e430d540a3ae2e8595b8117c10e5e3c2f65862af95ff94f5",
"sha256:f57a3784c799553a67d5ebc2c4854d4cc95e8c2c01f10861b97a0a829c09c36e"
],
"markers": "python_version >= '3.6'",
"version": "==0.1.5"
},
"greenlet": {
"hashes": [
"sha256:00e44c8afdbe5467e4f7b5851be223be68adb4272f44696ee71fe46b7036a711",
"sha256:013d61294b6cd8fe3242932c1c5e36e5d1db2c8afb58606c5a67efce62c1f5fd",
"sha256:049fe7579230e44daef03a259faa24511d10ebfa44f69411d99e6a184fe68073",
"sha256:14d4f3cd4e8b524ae9b8aa567858beed70c392fdec26dbdb0a8a418392e71708",
"sha256:166eac03e48784a6a6e0e5f041cfebb1ab400b394db188c48b3a84737f505b67",
"sha256:17ff94e7a83aa8671a25bf5b59326ec26da379ace2ebc4411d690d80a7fbcf23",
"sha256:1e12bdc622676ce47ae9abbf455c189e442afdde8818d9da983085df6312e7a1",
"sha256:21915eb821a6b3d9d8eefdaf57d6c345b970ad722f856cd71739493ce003ad08",
"sha256:288c6a76705dc54fba69fbcb59904ae4ad768b4c768839b8ca5fdadec6dd8cfd",
"sha256:32ca72bbc673adbcfecb935bb3fb1b74e663d10a4b241aaa2f5a75fe1d1f90aa",
"sha256:356b3576ad078c89a6107caa9c50cc14e98e3a6c4874a37c3e0273e4baf33de8",
"sha256:40b951f601af999a8bf2ce8c71e8aaa4e8c6f78ff8afae7b808aae2dc50d4c40",
"sha256:572e1787d1460da79590bf44304abbc0a2da944ea64ec549188fa84d89bba7ab",
"sha256:58df5c2a0e293bf665a51f8a100d3e9956febfbf1d9aaf8c0677cf70218910c6",
"sha256:64e6175c2e53195278d7388c454e0b30997573f3f4bd63697f88d855f7a6a1fc",
"sha256:7227b47e73dedaa513cdebb98469705ef0d66eb5a1250144468e9c3097d6b59b",
"sha256:7418b6bfc7fe3331541b84bb2141c9baf1ec7132a7ecd9f375912eca810e714e",
"sha256:7cbd7574ce8e138bda9df4efc6bf2ab8572c9aff640d8ecfece1b006b68da963",
"sha256:7ff61ff178250f9bb3cd89752df0f1dd0e27316a8bd1465351652b1b4a4cdfd3",
"sha256:833e1551925ed51e6b44c800e71e77dacd7e49181fdc9ac9a0bf3714d515785d",
"sha256:8639cadfda96737427330a094476d4c7a56ac03de7265622fcf4cfe57c8ae18d",
"sha256:8c790abda465726cfb8bb08bd4ca9a5d0a7bd77c7ac1ca1b839ad823b948ea28",
"sha256:8d2f1fb53a421b410751887eb4ff21386d119ef9cde3797bf5e7ed49fb51a3b3",
"sha256:903bbd302a2378f984aef528f76d4c9b1748f318fe1294961c072bdc7f2ffa3e",
"sha256:93f81b134a165cc17123626ab8da2e30c0455441d4ab5576eed73a64c025b25c",
"sha256:95e69877983ea39b7303570fa6760f81a3eec23d0e3ab2021b7144b94d06202d",
"sha256:9633b3034d3d901f0a46b7939f8c4d64427dfba6bbc5a36b1a67364cf148a1b0",
"sha256:97e5306482182170ade15c4b0d8386ded995a07d7cc2ca8f27958d34d6736497",
"sha256:9f3cba480d3deb69f6ee2c1825060177a22c7826431458c697df88e6aeb3caee",
"sha256:aa5b467f15e78b82257319aebc78dd2915e4c1436c3c0d1ad6f53e47ba6e2713",
"sha256:abb7a75ed8b968f3061327c433a0fbd17b729947b400747c334a9c29a9af6c58",
"sha256:aec52725173bd3a7b56fe91bc56eccb26fbdff1386ef123abb63c84c5b43b63a",
"sha256:b11548073a2213d950c3f671aa88e6f83cda6e2fb97a8b6317b1b5b33d850e06",
"sha256:b1692f7d6bc45e3200844be0dba153612103db241691088626a33ff1f24a0d88",
"sha256:b92e29e58bef6d9cfd340c72b04d74c4b4e9f70c9fa7c78b674d1fec18896dc4",
"sha256:be5f425ff1f5f4b3c1e33ad64ab994eed12fc284a6ea71c5243fd564502ecbe5",
"sha256:dd0b1e9e891f69e7675ba5c92e28b90eaa045f6ab134ffe70b52e948aa175b3c",
"sha256:e30f5ea4ae2346e62cedde8794a56858a67b878dd79f7df76a0767e356b1744a",
"sha256:e6a36bb9474218c7a5b27ae476035497a6990e21d04c279884eb10d9b290f1b1",
"sha256:e859fcb4cbe93504ea18008d1df98dee4f7766db66c435e4882ab35cf70cac43",
"sha256:eb6ea6da4c787111adf40f697b4e58732ee0942b5d3bd8f435277643329ba627",
"sha256:ec8c433b3ab0419100bd45b47c9c8551248a5aee30ca5e9d399a0b57ac04651b",
"sha256:eff9d20417ff9dcb0d25e2defc2574d10b491bf2e693b4e491914738b7908168",
"sha256:f0214eb2a23b85528310dad848ad2ac58e735612929c8072f6093f3585fd342d",
"sha256:f276df9830dba7a333544bd41070e8175762a7ac20350786b322b714b0e654f5",
"sha256:f3acda1924472472ddd60c29e5b9db0cec629fbe3c5c5accb74d6d6d14773478",
"sha256:f70a9e237bb792c7cc7e44c531fd48f5897961701cdaa06cf22fc14965c496cf",
"sha256:f9d29ca8a77117315101425ec7ec2a47a22ccf59f5593378fc4077ac5b754fce",
"sha256:fa877ca7f6b48054f847b61d6fa7bed5cebb663ebc55e018fda12db09dcc664c",
"sha256:fdcec0b8399108577ec290f55551d926d9a1fa6cad45882093a7a07ac5ec147b"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
"version": "==1.1.2"
},
"idna": {
"hashes": [
"sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff",
"sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"
],
"markers": "python_version >= '3'",
"version": "==3.3"
},
"pygments": {
"hashes": [
"sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380",
"sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6"
],
"markers": "python_version >= '3.5'",
"version": "==2.10.0"
},
"pyxdg": {
"hashes": [
"sha256:2d6701ab7c74bbab8caa6a95e0a0a129b1643cf6c298bf7c569adec06d0709a0",
"sha256:80bd93aae5ed82435f20462ea0208fb198d8eec262e831ee06ce9ddb6b91c5a5"
],
"version": "==0.27"
},
"requests": {
"hashes": [
"sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24",
"sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"
],
"index": "pypi",
"version": "==2.26.0"
},
"six": {
"hashes": [
"sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926",
"sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
"version": "==1.16.0"
},
"urllib3": {
"hashes": [
"sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece",
"sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'",
"version": "==1.26.7"
}
}
}
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# vim:fenc=utf-8
"""
Incomplete simulator for Civlo85/gsmHat
Modified from http://allican.be/blog/2017/01/15/python-dummy-serial-port.html
"""
import os, pty
from serial import Serial
import threading
import requests
from datetime import datetime
def listener(port):
# To store requests
http_request = None
#continuously listen to commands on the master device
while 1:
res = b""
while not res.endswith(b"\n"):
#keep reading one byte at a time until we have a full line
res += os.read(port, 1)
#print("command: %s" % res)
#write back the response
if res == b'AT+CMGF=1\n':
os.write(port, b"AT+CMGF=1\n")
os.write(port, b"OK\n")
elif res == b'AT+CPMS="SM"\n':
os.write(port, b'AT+CPMS="SM"\n')
os.write(port, b"+CPMS: 0,10,0,10,0,10\n")
os.write(port, b"OK\n")
elif res == b'AT+CGNSPWR=1\n':
os.write(port, b'AT+CGNSPWR=1\n')
os.write(port, b"OK\n")
elif res == b'AT+CGNSTST=0\n':
os.write(port, b"AT+CGNSTST=0\n")
os.write(port, b"OK\n")
elif res == b'AT+CGNSINF\n':
os.write(port, b"AT+CGNSINF\n")
# Return always the same coordinates but with different timestamp
os.write(port, b"+CGNSINF: 1,1,%s.000,33.011460,-117.114016,192.407,0.00,0.0,1,,1.0,2.3,2.1,,8,11,,,52,,\n" % bytes(datetime.now().strftime("%Y%m%d%H%M%S").encode()))
os.write(port, b"OK\n")
elif res == b'AT+SAPBR=2,1\n':
os.write(port, b"AT+SAPBR=2,1\n")
# Return the IP 10.2.2.2.
os.write(port, b'+SAPBR: 1,3,"10.2.2.2"\n')
os.write(port, b"OK\n")
elif res == b'AT+SAPBR=3,1,"Contype","GPRS"\n':
os.write(port, b'AT+SAPBR=3,1,"Contype","GPRS"\n')
os.write(port, b'\n')
os.write(port, b"OK\n")
elif res == b'AT+SAPBR=3,1,"APN","TM"\n':
os.write(port, b'AT+SAPBR=3,1,"APN","TM"\n')
os.write(port, b"OK\n")
elif res == b'AT+SAPBR=3,1,"USER",""\n':
os.write(port, b'AT+SAPBR=3,1,"USER",""\n')
os.write(port, b"OK\n")
elif res == b'AT+SAPBR=3,1,"PWD",""\n':
os.write(port, b'AT+SAPBR=3,1,"PWD",""\n')
os.write(port, b"OK\n")
elif res == b'AT+SAPBR=1,1\n':
os.write(port, b'AT+SAPBR=1,1\n')
os.write(port, b"+CGNSPWR: 1\n")
os.write(port, b'+CTZV: +4,0\n')
os.write(port, b'*PSUTTZ: 2021,11,5,8,5,26,"+4",0\n')
os.write(port, b'DST: 0\n')
os.write(port, b'+CIEV: 10,"20801","Orange F","Orange F", 0, 0\n')
os.write(port, b"OK\n")
elif res == b'AT+HTTPINIT\n':
os.write(port, b'AT+HTTPINIT\n')
os.write(port, b'OK\n')
elif res == b'AT+HTTPPARA="CID",1\n':
os.write(port, b'AT+HTTPPARA="CID",1\n')
os.write(port, b'OK\n')
elif res.startswith(b'AT+HTTPPARA="URL","'):
url = res.split(b'"')[3]
print(f"http request: {url.decode()}")
os.write(port, b'AT+HTTPPARA="URL","%s"\n' % url)
os.write(port, b'OK\n')
http_request = requests.get(url)
elif res == b'AT+HTTPACTION=0\n':
os.write(port, b'AT+HTTPACTION=0\n')
os.write(port, b'OK\n')
# Send the message that the request is ready
os.write(port, b'+HTTPACTION: 0,%d,1\n' % http_request.status_code)
elif res == b'AT+HTTPREAD\n':
os.write(port, b'AT+HTTPREAD\n')
os.write(port, b'+HTTPREAD: 1\n')
print(f"http response (code {http_request.status_code}): {http_request.text}")
#os.write(port, b"0\n")
os.write(port, b"%s\n" % bytes(http_request.text.encode()))
os.write(port, b'OK\r\n')
elif res == b'AT+HTTPTERM\n':
os.write(port, b'AT+HTTPTERM\n')
os.write(port, b'OK\n')
else:
print(f"Unknown command: {res}")
def main():
"""Start the testing"""
master,slave = pty.openpty() #open the pseudoterminal
s_name = os.ttyname(slave) #translate the slave fd to a filename
print(f"point gsmHat to this device: {s_name}")
listener(master)
if __name__=='__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment