EnglishSvenska

Press release: Volvo Connected Loadout with SMT (Service Machinery Trucks) in the Netherlands

SMT (Service Machinery Trucks) in the Netherlands made a press release regarding their support for Volvo Connected Load Out in the Netherlands. It's always fun seeing something products I've been developing getting into hands of dealers and customers.

Läs mer ›

Kategori: Blog, Timeline

Press release: Digitize the load out process with Volvo CE

See my collegue in the US Jenny Olsén explain how Connected Load Out can connect operators and truck drivers. Connected load out allows truck drivers to submit and order from their phone to avoid exiting the cab to communicate with operators.

 

Kategori: Blog, Timeline

Press release: Connected Load out and CJD Equipment

Kategori: Blog, Timeline

Press release: Maximize your load out process with Connected Load Out

Connected Load Out is a cloud-based productivity service designed to improve the efficiency of the load out process in a quarry. The service is available for Volvo wheel loaders with Load Assist and On-Board Weighing or Volvo excavators with Dig Assist and On-Board Weighing.

Press release

Press release as a pdf

Kategori: Blog, Timeline

Volvo CE has introduced the software I've been working on in North America

I'm proud to share that Volvo CE has introduced the software I've been working on in North America. Connected Map as a whole provides Volvo customers with real-time insights into vehicle utilization, location and material movement. It revolutionizes fleet management, improves productivity, and enhances project performance.

Kategori: Blog, Timeline

Volvo CE introduces the tool I've been working on: Connected Load Out

At Conexpo Volvo CE and Swecon introduced the tool I've been working on: Volvo CE Connected Load Out.

It has 3 main components:

  • The Copilot screen which is integrated in the loader (usually a wheel loader or an excavator)
  • A mobile app that the truck driver uses
  • Site office for overview, administration and planning

From Conexpo (The mobile app on the left which is where most of my contribution is):

In short, it's all about moving material more efficient at querries. When you connect the loader, the truck driver and site office you know where the vehicles are and get better control on how to move material more efficiently. Great stuff really, and it will only get better.

How it works:

Connected Load Out connects and shares information digitally between loaders, site offices and trucks in one quarry. Load orders can be sent directly from incoming trucks via the Connected Load Out app to the loader's Volvo Co-Pilot. The loader driver can see an estimated arrival time and which material is to be loaded, which facilitates the planning of the work and reduces stress and the risk of errors. When the truck arrives at the workplace, the truck driver receives a notification in Volvo Co-Pilot and can summon the truck for loading and dispatch. A load receipt is created and sent to both the truck and the site office, so that the entire flow is visible in the Connected Load Out Office Portal.

 

 

Links:

Kategori: Blog, Timeline

Connectivity and Volvo Construction Equipment

I am doing software development for Volvo Construction Equipment and their Efficient Load Out product suite. Efficient Load Out is a digital solution which connects machine operators, truck drivers and site managers in real-time to maximize the profitability and sustainability of mass excavation projects. I have been working exclusively in native Swift programming handling low-level network communication between vehicles, and high-level GUI programming.

Kategori: Blog, Timeline

Running a company making payment solutions: Paylando!

Our business concept is simple: we sell solutions for unmanned and cashless payments. Contactless means payments with Swish, payment card or access card. Unmanned can be anything between vending machines, rides, barriers, doors or an idea we haven't heard of before.

I'm mainly responsible for the payment system backend and making sure everything runs smoothly. Technologies include a tech-stack of C#, .net, Azure functions for the payment processing. Typescript and React is used for the frontend and customer facing aspects.

Kategori: Blog, Timeline

Back to basics with October CMS

My brother needed a new simple one-page website for his CV. I usually do my websites in WordPress, but today I wanted to try something new. The content management systems (CMS) I evaluated were:

  • Craftcms
  • contentful
  • Octobercms.com
  • Pagekit
  • Bolt
  • Sitecake
  • Getkirby
  • Bludit

I found a winner: OctoberCMS! It truly is great for developing websites. Not as complicated as most CMS have gotten. Just a simple structure with real files to describe the content of the website. The website is divided into layouts, pages, partials and content. The layout is like the theme. The layout includes partials. When you want a new page (a new url) you add a page. (I skipped using the content type for now since I was making a one-page website). The editor is just simple HTML, (but you can add a proper wysiwyg editor if you want). For more complicated stuff (ecommerce and so on) you can add plugins.

You can check out the website at https://jonathannilsson.com/

Taggad med: ,
Kategori: Blog

Appium MQTT backdoor

Appium is generally considered a blackbox testing tool, that is it has no access to the app's methods. Appium acts on the elements accessible by an user.

But what if that is not enough? For example if you want to simulate an incoming notification, a bluetooth device connection, or a crash? For that you need whitebox testing with access to the app's internal methods.

Inspiration

There are ways to do whitebox testing in Android using the espresso driver: https://appiumpro.com/editions/51

There is also a library to add backdoor testing to iOS+Appium: https://github.com/alexmx/Insider

But neither of these solutions work as a backdoor in C# apps, and I am mainly thinking about Android and iOS apps using the Xamarin framework. I also want my backdoor to be callable from Python and Robot Framework. For that I made a backdoor with MQTT messaging.

Prerequisites

MQTT broker

Appium

Not really necessary for this backdoor to work, but it is a really good tool for testing mobile apps.

Python

Necessary to call the backdoor from if you want to use the code I wrote, but you could implement the backdoor access in any language. You just need to be able to call a MQTT broker.

Robot framework

Only necessary if you want to use it. You could run the tests in python or any other language.

Add testing backdoors to your app

Implement the backdoor in your C# app

Add a handler to the backdoor events:

// Initialize the MQTT backdoor
Task t = Backdoor.Instance.Initialize(mqttHost: "YOUR_MQTT_HOST");

// Handle backdoor events
Backdoor.Instance.BackdoorEvent += HandleBackdoorEvent;
private void HandleBackdoorEvent(object sender, BackdoorEventArgs e)
{
    // here is where you implement the backdoors
    if (e.Subtopic == "ReceiveNotification")
    {
        DisplayPopupMessage(e.Payload);
    }
}

There is an example app implemented in Xamarin forms in /AppBackdoor/BackdoorExampleApp

Use the backdoor from your tests

There is a python module in appium-mqtt-backdoor\BackdoorAccess\BackdoorAccess

Call it from python like so:

from BackdoorAccess.BackdoorAccess import BackdoorAccess

backdoorAccess = BackdoorAccess(broker_host=MQTT_BROKER_HOST)
backdoorAccess.backdoor('ReceiveNotification', 'Showing popup via backdoor')

I made two examples on how to use the backdoor. One in Robot framwork and one in pure python. Both uses the same python module implementation.

Robot framework example

*** Settings ***
Library            AppiumLibrary
Library            ../BackdoorAccess/BackdoorAccess.py    

*** Variables ***
${APPIUM_SERVER}            http://127.0.0.1:4723/wd/hub
${Android apk path}         ${CURDIR}/../../AppBackdoor/BackdoorExampleApp/BackdoorExampleApp.Android/bin/Debug/com.companyname.backdoorexampleapp-Signed.apk
${Android package name}     com.companyname.backdoorexampleapp
${iOS app path}             ${CURDIR}/../../AppBackdoor/BackdoorExampleApp/BackdoorExampleApp.iOS/bin/iPhoneSimulator/Release/BackdoorExampleApp.iOS.app
${Apple team id}            

*** Test Cases ***
Test button press and notifications on Android app
    [Tags]  Android
    Open Android example app
    Click button and check that label was updated
    Simulate a notification
	Sleep  2
	Close application

Test button press and notifications on iOS app
    [Tags]  iOS
    Open iOS example app
    Click button and check that label was updated
    Simulate a notification
    Sleep  2
	Close application


*** Keywords ***
Open Android example app
    Open Application    ${APPIUM_SERVER}    platformName=Android    deviceName=Android Emulator    noReset=true    autoGrantPermissions=true  app=${Android apk path}  appPackage=${Android package name}

Open iOS example app
    Open Application    ${APPIUM_SERVER}    platformName=iOS    deviceName=iPhone 8    automationName=XCUITest    noReset=true    platformVersion=13.4    xcodeOrgId=${Apple team id}    xcodeSigningId=iPhone Developer    app=${iOS app path}

Click button and check that label was updated
	Click element  accessibility_id=A button
	Element Should Contain Text  accessibility_id=Number of button clicks  Button was pressed once

Simulate a notification
    Backdoor  ReceiveNotification  Showing popup via backdoor

Python unittest example

import unittest
import os
from appium import webdriver
from BackdoorAccess.BackdoorAccess import BackdoorAccess
import time

script_folder = os.path.dirname(os.path.realpath(__file__))

MQTT_BROKER_HOST = 'YOUR_MQTT_HOST'
APPLE_TEAM_ID = 'your team id'

class MyTestCase(unittest.TestCase):
    def test_button_press_and_notifications_on_android(self):
        self.open_android_example_app()
        self.click_button_and_check_that_label_was_updated()
        self.simulate_a_notification()
        time.sleep(2)
        self.driver.close_app()

    def test_button_press_and_notifications_on_ios(self):
        self.open_ios_example_app()
        self.click_button_and_check_that_label_was_updated()
        self.simulate_a_notification()
        time.sleep(2)
        self.driver.close_app()

    def open_android_example_app(self):
        desired_caps = {}
        desired_caps['platformName'] = 'Android'
        desired_caps['deviceName'] = 'Android Emulator'
        desired_caps['noReset'] = True
        desired_caps[
            'app'] = f'{script_folder}/../../AppBackdoor/BackdoorExampleApp/BackdoorExampleApp.Android/bin/Release/com.companyname.backdoorexampleapp-Signed.apk'
        desired_caps['appPackage'] = 'com.companyname.backdoorexampleapp'

        self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

    def open_ios_example_app(self):
        # modify these capabilities to work on your machine
        desired_caps = {}
        desired_caps['platformName'] = 'iOS'
        desired_caps['deviceName'] = 'iPhone 8'
        desired_caps['automationName'] = 'XCUITest'
        desired_caps['noReset'] = True
        desired_caps['platformVersion'] = '13.4'
        desired_caps['xcodeOrgId'] = APPLE_TEAM_ID
        desired_caps['xcodeSigningId'] = 'iPhone Developer'
        desired_caps['app'] = os.path.abspath(f'{script_folder}/../../AppBackdoor/BackdoorExampleApp/BackdoorExampleApp.iOS/bin/iPhoneSimulator/Release/BackdoorExampleApp.iOS.app')

        self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

    def click_button_and_check_that_label_was_updated(self):
        # click button
        button = self.driver.find_element_by_accessibility_id('A button')
        button.click()

        # check that label text was updated
        label = self.driver.find_element_by_accessibility_id('Number of button clicks')
        self.assertEqual('Button was pressed once', label.text)

    def simulate_a_notification(self):
        backdoorAccess = BackdoorAccess(broker_host=MQTT_BROKER_HOST)
        backdoorAccess.backdoor('ReceiveNotification', 'Showing popup via backdoor')


if __name__ == '__main__':
    unittest.main()

Security

Obviously having a backdoor in your application is a data security issue. Disable all backdoors before shipping the application:

#if BACKDOOR_ENABLED
// Initialize the MQTT backdoor
Task t = Backdoor.Instance.Initialize(mqttHost: "YOUR_MQTT_HOST");
...
#endif

Download

sebnil/appium-mqtt-backdoor git repo

Support me creating open source software

Flattr this git repo

Buy Me a Coffee at ko-fi.com

Taggad med: , ,
Kategori: Blog