This repository has been archived by the owner on Nov 25, 2022. It is now read-only.
/
AWSAutonomousVehicleIOT.py
155 lines (131 loc) · 6.43 KB
/
AWSAutonomousVehicleIOT.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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#!/usr/bin/python
# Replace aws_rest_endpoint with your AWS IoT endpoint dns name
# Replace the ca_path, cert_path and key_path with the credentials to you created with the AWS IoT service
# Replace your vehicleid and wheel_travel with your vehicle information
# DynamoDB TTL is set for 30 days for expiration
# battery_capacity is an arbitrary number
# Replace vehicle_topic with the AWS IoT that you want to send the telemetry to
import time
from time import sleep
import json
import random
import uuid
import datetime
import paho.mqtt.client as paho
import ssl
import rightfrontwheel
import leftfrontwheel
import rightrearwheel
import leftrearwheel
# Fill out this area with AWS account specific details
aws_rest_endpoint = "youriotendpoint.iot.us-east-1.amazonaws.com"
awsport = 8883
# Location of Certificates
ca_path = "/home/pi/d2/creds/VeriSign-Class 3-Public-Primary-Certification-Authority-G5.pem"
cert_path = "/home/pi/d2/creds/avaws01.donkeycar.cert.pem"
key_path = "/home/pi/d2/creds/avaws01.donkeycar.private.key"
connflag = False
def on_connect(client, userdata, flags, rc):
global connflag
connflag = True
print("Connection returned result: " + str(rc))
def on_message(client, userdata, msg):
print(msg.topic+" "+str(msg.payload))
print(Iot_Topic+str(msg.payload))
def getTime():
currenttime = time.localtime()
return (time.strftime("%Y%m%d%H%M%S", currenttime))
def drivetelemetry():
vehicleid = "avaws01"
actualtime = getTime()
unixtime = str(datetime.datetime.now())
event = uuid.uuid4()
eventid = event.hex
dynamodb_ttl = int(time.time()) + 2592000
wheel_travel = 9.5
feet = 12
wheel_rotations_per_mile = 63360
speed_reset = random.randint(1, 9)
battery_capacity = 5320
right_front_wheel_rpm = int(rightfrontwheel.get_wheelrpm())
right_front_wheel_odometer = round((rightfrontwheel.get_wheeldistance())/feet, 2)
right_front_wheel_distance = right_front_wheel_rpm * wheel_travel
right_front_wheel_mpm = right_front_wheel_distance / wheel_rotations_per_mile
right_front_wheel_mph = right_front_wheel_mpm * 60
right_front_wheel_speed = round(right_front_wheel_mph)
right_front_wheel_data = {"right_front_speed": right_front_wheel_speed, "right_front_rpm": right_front_wheel_rpm, "right_front_wheel_odometer": right_front_wheel_odometer}
left_front_wheel_rpm = int(leftfrontwheel.get_wheelrpm())
left_front_wheel_odometer = round((leftfrontwheel.get_wheeldistance())/feet, 2)
left_front_wheel_distance = left_front_wheel_rpm * wheel_travel
left_front_wheel_mpm = left_front_wheel_distance / wheel_rotations_per_mile
left_front_wheel_mph = left_front_wheel_mpm * 60
left_front_wheel_speed = round(left_front_wheel_mph)
left_front_wheel_data = {"left_front_speed": left_front_wheel_speed, "left_front_rpm": left_front_wheel_rpm, "left_front_wheel_odometer": left_front_wheel_odometer}
right_rear_wheel_rpm = int(rightrearwheel.get_wheelrpm())
right_rear_wheel_odometer = round((rightrearwheel.get_wheeldistance())/feet, 2)
right_rear_wheel_distance = right_rear_wheel_rpm * wheel_travel
right_rear_wheel_mpm = right_rear_wheel_distance / wheel_rotations_per_mile
right_rear_wheel_mph = right_rear_wheel_mpm * 60
right_rear_wheel_speed = round(right_rear_wheel_mph)
right_rear_wheel_data = {"right_rear_speed": right_rear_wheel_speed, "right_rear_rpm": right_rear_wheel_rpm, "right_rear_wheel_odometer": right_rear_wheel_odometer}
left_rear_wheel_rpm = int(leftrearwheel.get_wheelrpm())
left_rear_wheel_odometer = round((leftrearwheel.get_wheeldistance())/feet, 2)
left_rear_wheel_distance = left_rear_wheel_rpm * wheel_travel
left_rear_wheel_mpm = left_rear_wheel_distance / wheel_rotations_per_mile
left_rear_wheel_mph = left_rear_wheel_mpm * 60
left_rear_wheel_speed = round(left_rear_wheel_mph)
left_rear_wheel_data = {"left_rear_speed": left_rear_wheel_speed, "left_rear_rpm": left_rear_wheel_rpm, "left_rear_wheel_odometer": left_rear_wheel_odometer}
vehicle_speed = int((right_front_wheel_speed + right_rear_wheel_speed + left_front_wheel_speed + left_rear_wheel_speed)/4)
average_wheel_rpm = int((right_front_wheel_rpm + right_rear_wheel_rpm + left_front_wheel_rpm + left_rear_wheel_rpm)/4)
vehicle_odometer = ((right_front_wheel_odometer + right_rear_wheel_odometer + left_front_wheel_odometer + left_rear_wheel_odometer)/4)
remaining_power = int(battery_capacity - vehicle_odometer)
engine_rpm = int(average_wheel_rpm * 11)
# JSON Key/Value pairs of telemetry
vehiclepayload = json.dumps(
{
"vehicleid": vehicleid,
"eventid": eventid,
"time": actualtime,
"timestamp": unixtime,
"average_wheel_rpm": average_wheel_rpm,
"engine_rpm": engine_rpm,
"vehicle_speed": vehicle_speed,
"vehicle_odometer": vehicle_odometer,
"remaining_power": remaining_power,
"right_front_wheel_rpm": right_front_wheel_rpm,
"left_front_wheel_rpm": left_front_wheel_rpm,
"right_rear_wheel_rpm": right_rear_wheel_rpm,
"left_rear_wheel_rpm": left_rear_wheel_rpm,
"right_front_wheel_speed": right_front_wheel_speed,
"left_front_wheel_speed": left_front_wheel_speed,
"right_rear_wheel_speed": right_rear_wheel_speed,
"left_rear_wheel_speed": left_rear_wheel_speed,
"right_front_wheel_odometer": right_front_wheel_odometer,
"left_front_wheel_odometer": left_front_wheel_odometer,
"right_rear_wheel_odometer": right_rear_wheel_odometer,
"left_rear_wheel_odometer": left_rear_wheel_odometer,
"dynamodb_ttl": dynamodb_ttl
}
)
# print (vehiclepayload)
return(vehiclepayload)
# Logging can be enabled by uncommenting below
# def on_log(client, userdata, level, buf):
# print(msg.topic+" "+str(msg.payload))
# print(Iot_Topic +str(msg.payload))
mqttc = paho.Client()
mqttc.on_connect = on_connect
mqttc.on_message = on_message
# mqttc.on_log = on_log
mqttc.tls_set(ca_path, certfile=cert_path, keyfile=key_path, cert_reqs=ssl.CERT_REQUIRED, tls_version=ssl.PROTOCOL_TLSv1_2, ciphers=None)
mqttc.connect(aws_rest_endpoint, awsport, keepalive=60)
# Begin reading sensor telemetry
mqttc.loop_start()
# drivetelemetry()
for r in range(10000000):
# Sending telemetry to AWS IoT Service
vehicle_topic = "/topics/DonkeyCars/AVAWS01"
telemetry_payload = drivetelemetry()
print(telemetry_payload)
mqttc.publish(vehicle_topic, telemetry_payload, 1)
sleep(1)