-
Notifications
You must be signed in to change notification settings - Fork 288
/
pythoncan.py
67 lines (54 loc) · 2.86 KB
/
pythoncan.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import argparse
import time
import uuid
import can
import paho.mqtt.client as mqtt
import ssl
#def sender(id):
# for i in range(10):
# msg = can.Message(arbitration_id=0x7E0, data=[id, i, 0, 1, 3, 1, 3, 1], is_extended_id=False)
# bus.send(msg)
# time.sleep(1)
# The callback for when the client receives a CONNACK response from the server.
def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc))
# Subscribing in on_connect() means that if we lose the connection and
# reconnect then subscriptions will be renewed.
client.subscribe(topic + "/+", qos=0)
# The callback for when a PUBLISH message is received from the server.
def on_message(client, userdata, msg):
print(msg.topic+" "+str(msg.payload))
client_id = str(uuid.uuid4())
parser = argparse.ArgumentParser(description='SocketCAN To MQTT Conduit')
parser.add_argument('-u', action='store', dest='username', help='Specify MQTT Username')
parser.add_argument('-p', action='store', dest='password', help='Specify MQTT Password')
parser.add_argument('-b', action='store', dest='bustype', default='socketcan', help='Set usage of a different bus type (defaults to socketcan)')
parser.add_argument('-i', action='store', dest='channel', default='can0', help='Specify which socketcan interface to use')
parser.add_argument('-s', action='store', dest='speed', default=500000, type=int, help='Set speed of socketcan interface')
parser.add_argument('-t', action='store', dest='topic', default="can", help='Set MQTT topic to use')
parser.add_argument('-H', action='store', dest='mqtthost', default="api.savvycan.com", help='Set hostname of MQTT Broker')
parser.add_argument('-P', action='store', dest='mqttport', default=8883, type=int, help='Set port to connect to on MQTT Broker')
arg_results = parser.parse_args()
bus = can.interface.Bus(channel=arg_results.channel, bustype=arg_results.bustype, bitrate=arg_results.speed)
client = mqtt.Client(client_id=client_id, clean_session=True)
client.on_connect = on_connect
client.on_message = on_message
if arg_results.mqttport == 8883:
client.tls_set(ca_certs=None, certfile=None, keyfile=None, cert_reqs=ssl.CERT_REQUIRED, tls_version=ssl.PROTOCOL_TLS, ciphers=None)
if len(arg_results.username) > 0:
client.username_pw_set(arg_results.username, arg_results.password)
client.connect(arg_results.mqtthost, arg_results.mqttport, 60)
run = True
while run:
client.loop(timeout=0.02)
for msg in bus:
print(msg.arbitration_id)
#msg.arbitration_id, msg.timestamp, and msg.data
flags = 0
if (msg.is_extended_id): flags += 1
if (msg.is_remote_frame): flags += 2
if (msg.is_fd): flags += 4
if (msg.error_state_indicator): flags += 8
microsStamp = int(msg.timestamp * 1000000).to_bytes(8, 'little')
fullTopic = arg_results.topic + "/" + str(msg.arbitration_id)
client.publish(fullTopic, microsStamp + int(flags).to_bytes(1, 'little') + msg.data, qos=0)